<template>
  <!-- 最外层容器 -->
  <view class="my-settle-container">
     <!-- 全选区域 -->
     <label class="radio" @click="changeAllState">
         <radio  color="#C00000" :checked="isFullCheck"/><text>全选</text>
     </label>
     <!-- //全选区域 -->
     <!-- 合计区域 -->
     <view class="amount-box">
       合计:<text class="amount">￥{{checkedGoodsAmount}}</text>
     </view>
     <!-- //合计区域 -->
     <!-- 结算按钮 -->
       <view class="btn-settle" @click="settlement">结算({{checkedCount}})</view>
     <!-- //结算按钮 -->
     
      
  </view>
</template>

<script>
  import {mapGetters,mapMutations,mapState} from 'vuex'
  export default {
    name:"my-settle",
    computed:{
      ...mapGetters('m_cart',['checkedCount','total','checkedGoodsAmount']),
      //addstr是详细的地址信息
      ...mapGetters('m_user',['addstr']),
      ...mapState('m_user',['token']),
      ...mapState('m_cart',['cart']),
      //  动态渲染全选按钮的状态
      isFullCheck(){
        //当购物车所有商品的数量等于已勾选商品数量的时候就是true
        return  this.total===this.checkedCount
      }
    },
    data() {
      return {
        //秒数
        seconds:3,
        //定时器的id
        timer:null
      };
    },
    methods:{
      //引入vuex修改商品选中状态的方法
      ...mapMutations('m_cart',['updateAllGoodsState']),
      ...mapMutations('m_user',['updateRedirectInfo']),
      //点击全选按钮
      changeAllState() {
        // console.log(!this.isFullCheck)
        //点击全选按钮变为true
        this.updateAllGoodsState(!this.isFullCheck)
      },
      //点击结算按钮
      settlement(){
        //先判断有么有勾选结算的商品
        if(!this.checkedCount) return uni.$showMsg('请选择结算的商品')
        //再判断有没有写收货地址
        if(!this.addstr) return uni.$showMsg('请选择收货地址')
        //再判断有没有登录token
        // if(!this.token) return uni.$showMsg('您还未登录,请登录')
        if(!this.token) return this.delayNavigate()
        //发起微信支付功能
        this.payOrder()
      },
    async payOrder(){
        // 1. 创建订单
          // 1.1 组织订单的信息对象
          const orderInfo ={
            //订单总价
            // order_price:this.checkedGoodsAmount,
            //开发测试总价写死0.01
            order_price:0.01,
            //订单地址
            consignee_addr:this.addstr,
            //勾选的商品
            goods:this.cart.filter(x=>x.goods_state).map(item=>({
              goods_id:item.goods_id,
              goods_number:item.goods_count,
              goods_price:item.goods_price
            }))
          }
          // 1.2 发起请求创建订单
        const {data:res} = await uni.$http.post('/api/public/v1/my/orders/create', orderInfo)
          // 1.3 得到服务器响应的“订单编号”
          if (res.meta.status !== 200) return uni.$showMsg('创建订单失败！')
          const orderNumber =res.message.order_number
        //2.订单预支付
          //2.1 发起请求获取订单的支付信息
         const {data:res2} = await uni.$http.psot('/api/public/v1/my/orders/req_unifiedorder',{order_number:orderNumber})
         if(res2.meta.status!==200) return uni.$showError('预付订单生成失败！')
         // 2.3 得到订单支付相关的必要参数
         const payInfo = res2.message.pay
       //3发起微信支付
         // 3.1调用uni.requestpayment()发起微信支付
        const [err,succ] = await uni.requestPayment(payInfo)
        //3.2未完成支付
        if(err) return uni.$showMsg('订单未支付')
         // 3.3 完成了支付，进一步查询支付的结果.
         const {data:res3} = await uni.$http.post('/api/public/v1/my/orders/chkOrder',{order_number:orderNumber})
          // 3.4 检测到订单未支付
         if(res3.meta.status!==200)return uni.$showMsg('订单未支付！')
         //3.5检测订单支付完成提示消息支付成功
         uni.showToast({
           title:'支付成功',
           icon:'success'
         })
      },
      //展示倒计时提示消息
      showTips(n){
        uni.showToast({
          //不展示任何图标
          icon:'none',
          title:'请登录后再结算'+n+'秒后自动跳转到登录页面',
          //遮罩层避免点击穿透
          mask:true,
          //1.5秒后消失
          duration:1500
        })
      },
      //延迟导航到my页面的方法
      delayNavigate(){
        //为了避免点击结算过后倒计时不被重置
        //将倒计时重置为3
        this.seconds=3
        // 1. 展示提示消息，此时 seconds 的值等于 3
        this.showTips(this.seconds)
        // 2. 创建定时器，每隔 1 秒执行一次
      this.timer = setInterval(()=>{
          //先让秒数自身-1
          this.seconds--
          //当定时器的秒数小于等于0  跳转到登录页面
          if(this.seconds<=0) {
            //清除定时器
            clearInterval(this.timer)
            //跳转到登录页面
            uni.switchTab({
              url:'/pages/my/my',
              //页面跳转之后的回调函数,把跳转的信息存到Store 
              success:() =>{
                //登录成功之后将页面返回跳转信息存到vuex
                this.updateRedirectInfo({
                  //页面跳转方式
                  opentype:'switchTab',
                  //从哪个页面跳转过去的
                  from:'/page/cart/cart'
                })
              }
            })
           // 终止后续代码的运行（当秒数为 0 时，不再展示 toast 提示消息）
            return
          }
          //再根据最新的秒数展示提示消息
         this.showTips(this.seconds)
        },1000)
      }
    }
  }
</script>

<style lang="scss">
.my-settle-container {
  // 设置为flex布局
  display: flex;
  justify-content: space-between;
  align-items: center;
  /* 底部固定定位 */
  position: fixed;
  bottom: 0;
  left: 0;
  /* 设置宽高和背景色 */
  width: 100%;
  height: 50px;
  background-color: white;
   padding-left: 5px;
    font-size: 14px;
    .radio {
      display: flex;
      align-items: center;
    }
  .amount {
    color: #c00000;
  }
  .btn-settle {
    height: 50px;
    min-width: 100px;
    background-color: #c00000;
    color: white;
    line-height: 50px;
    text-align: center;
    padding: 0 10px;
  }
}
</style>
